#!/usr/bin/python
#
# Copyright (c) 2016 SUSE Linux LLC
# All Rights Reserved.
#
# Author: Bo Maryniuk <bo@suse.de>

import hashlib
import os
import sys

from zypp_plugin import Plugin


class DriftDetector(Plugin):
    """
    Return diff of the installed packages outside the Salt.
    """

    def __init__(self):
        Plugin.__init__(self)
        self.ck_path = "/var/cache/salt/minion/rpmdb.cookie"
        self.rpm_path = "/var/lib/rpm/Packages"

    def _get_mtime(self):
        """
        Get the modified time of the RPM Database.
        Returns:
            Unix ticks
        """
        return (
            os.path.exists(self.rpm_path) and int(os.path.getmtime(self.rpm_path)) or 0
        )

    def _get_checksum(self):
        """
        Get the checksum of the RPM Database.
        Returns:
            hexdigest
        """
        digest = hashlib.sha256()
        with open(self.rpm_path, "rb") as rpm_db_fh:
            while True:
                buff = rpm_db_fh.read(0x1000)
                if not buff:
                    break
                digest.update(buff)

        return digest.hexdigest()

    def PLUGINEND(self, headers, body):
        """
        Hook when plugin closes Zypper's transaction.        
        """
        if "SALT_RUNNING" not in os.environ:
            with open(self.ck_path, "w") as ck_fh:
                ck_fh.write(
                    "{chksum} {mtime}\n".format(
                        chksum=self._get_checksum(), mtime=self._get_mtime()
                    )
                )

        self.ack()


DriftDetector().main()
